const http = require('http');
const fs = require('fs');
const path = require('path');

// 确定读取目标（同任务1）
const targetFileName = process.argv[2] || __filename;
const targetPath = path.join(__dirname, targetFileName);

// 创建服务器
const server = http.createServer((req, res) => {
  if (req.url !== '/') {
    res.writeHead(404);
    res.end('仅支持访问根路径（localhost:8081）');
    return;
  }

  // 1. 打开文件：flag='r' 表示只读模式，获取文件描述符（fd）
  fs.open(targetPath, 'r', (err, fd) => {
    if (err) {
      res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });
      res.end(`错误：文件打开失败\n原因：${err.message}`);
      return;
    }

    // 2. 准备 Buffer 存储读取的数据（1024 字节/块，适合分批读取大文件）
    const buf = Buffer.alloc(1024);
    let fileContent = ''; // 拼接所有读取到的内容

    // 3. 分批读取文件（递归调用，直到读完）
    function readFileChunk() {
      // fs.read 参数：fd（文件描述符）、buf（存储Buffer）、buf起始位置、读取长度、文件起始位置、回调
      fs.read(fd, buf, 0, buf.length, null, (readErr, bytesRead, buffer) => {
        if (readErr) {
          // 读取错误时需先关闭文件，避免资源泄漏
          fs.close(fd, (closeErr) => {
            if (closeErr) console.error('关闭文件失败：', closeErr);
          });
          res.writeHead(500, { 'Content-Type': 'text/plain; charset=utf-8' });
          res.end(`错误：文件读取失败\n原因：${readErr.message}`);
          return;
        }

        // bytesRead=0 表示已读取完毕
        if (bytesRead > 0) {
          // 将 Buffer 中实际读取的部分（0~bytesRead）转为字符串，拼接到内容中
          fileContent += buffer.slice(0, bytesRead).toString('utf8');
          readFileChunk(); // 继续读取下一块
        } else {
          // 4. 读取完毕，关闭文件描述符
          fs.close(fd, (closeErr) => {
            if (closeErr) {
              res.writeHead(500);
              res.end(`错误：文件关闭失败\n原因：${closeErr.message}`);
              return;
            }
            // 响应完整内容
            res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
            res.end(`文件内容如下（底层API读取）：\n\n${fileContent}`);
          });
        }
      });
    }

    // 启动第一批读取
    readFileChunk();
  });
});

// 启动服务器
server.listen(8081, () => {
  console.log(`服务器已启动：http://localhost:8081`);
  console.log(`当前读取目标：${targetFileName || '默认读取自身（fileReader2.js）'}`);
});